home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Controls / Visual Basic Controls.iso / vbcontrol / sregexpf / substrin.cpp < prev    next >
C/C++ Source or Header  |  1998-06-01  |  2KB  |  97 lines

  1. #include "stdafx.h"
  2. #include "sgRegExp.h"  
  3. #include "Substrings.h"
  4. #include "Substring.h"
  5. #include "clsRegExp.h"
  6.  
  7.  
  8. HRESULT Substrings::Init(const class Regexp& re)
  9. {
  10.     delete [] m_Items;
  11.     m_Items = 0;
  12.     m_Count = (short)(re.SubStrings() + 1);
  13.     if (m_Count != 0)
  14.     {
  15.         m_Items = new CComVariant[m_Count];
  16.         for (short i = 0; i < m_Count; i++)
  17.         {
  18.             CComObject<Substring>* substr = new CComObject<Substring>;
  19.             if (substr == 0)
  20.                 return E_OUTOFMEMORY;
  21.             substr->m_Value  = re[i].c_str();
  22.             substr->m_Start  = re.SubStart(i);
  23.             substr->m_Length = re.SubLength(i);
  24.  
  25.             IDispatch* pDisp;
  26.             HRESULT hr = substr->QueryInterface(IID_IDispatch, reinterpret_cast<void**>(&pDisp));
  27.             if (FAILED(hr))
  28.             {
  29.                 delete substr;
  30.                 return hr;
  31.             }
  32.             m_Items[i] = pDisp;
  33.             pDisp->Release();
  34.         }
  35.     }
  36.     return S_OK;
  37. }
  38.  
  39. STDMETHODIMP Substrings::InterfaceSupportsErrorInfo(REFIID riid)
  40. {
  41.     static const IID* arr[] =  
  42.     {
  43.         &IID_ISubstrings,
  44.     };
  45.     for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
  46.     {
  47.         if (InlineIsEqualGUID(*arr[i],riid))
  48.             return S_OK;
  49.     }
  50.     return S_FALSE;
  51. }
  52.  
  53.  
  54. STDMETHODIMP Substrings::get__NewEnum(/*[out, retval]*/ IUnknown** retval)
  55. {
  56.     if (retval == 0)
  57.         return E_POINTER;
  58.     if (m_Items == 0)
  59.         return E_FAIL;
  60.  
  61.     *retval = 0;
  62.     typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > EnumVar;
  63.     CComObject<EnumVar>* ev = new CComObject<EnumVar>;
  64.     HRESULT hr = ev->Init(m_Items, m_Items + m_Count, NULL, AtlFlagNoCopy);
  65.     if (SUCCEEDED(hr))
  66.     {
  67.         //hr = ev->QueryInterface(IID_IEnumVARIANT, reinterpret_cast<void**>(retval));
  68.         hr = ev->QueryInterface(IID_IUnknown, reinterpret_cast<void**>(retval));
  69.     }
  70.     if (FAILED(hr))
  71.         delete ev;
  72.  
  73.     return hr;
  74. }
  75.  
  76. STDMETHODIMP Substrings::get_Item(/*[in]*/ short index, /*[out, retval]*/ ISubstring** retval)
  77. {
  78.     if (retval == 0)
  79.         return E_POINTER;
  80.     if ((index < 0) || (index >= m_Count))
  81.         return E_INVALIDARG;
  82.  
  83.     HRESULT hr = m_Items[index].punkVal->QueryInterface(IID_ISubstring, reinterpret_cast<void**>(retval));
  84.     if (FAILED(hr))
  85.         return AtlReportError(CLSID_Substrings, IDS_ERR_NOSUBSTRING, GUID_NULL, hr);
  86.     return hr;
  87. }
  88.  
  89. STDMETHODIMP Substrings::get_Count(/*[out, retval]*/ short* retval)
  90. {
  91.     if (retval == 0)
  92.         return E_POINTER;
  93.  
  94.     *retval = m_Count;
  95.     return S_OK;
  96. }
  97.